package com.atguigu.config;

import com.atguigu.dao.BookDao;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

/**
 * 自动装配Autowired
 *      可以放在构造器、setter方法、参数
 *      1）放在方法。这是方法的参数从容器中获取
 *      2）放在构造器。如果只有一个有参构造，这时候autowired可以省略
 *      3）放在参数位置
 *
 *      1。@AutoWired默认按照类型去找容器中的组件，
 *      2.如果相同类型的bean注入了多个，需要@Qualifier定义需要装配的组件的id，而不是使用属性名
 *        即组件有多实现，自动装配用auto+quali
 *      3。默认autowire是必须找到需要装配的组件，但可以通过@Autowired(required=false)指定为不必须
 *
 *      4。组件有多实现，也可以使用@Primary注解，即自动装配首选bean
 *      5.在没有@Qualifier明确指定的时候，装配Primary指定的组件
 *          有@Qualifier明确指定的，装配@Qualifier指定的组件
 *
 *      6。spring还支持使用@Resource和@Inject「java规范注解」
 *          Resource:
 *              可以和AutoWired一样实现自动装配的功能，默认是按照组件名称进行装配
 *              在spring4中不支持@Primary，不支持@Resource（required=false）
 *          Inject:
 *              需要导入依赖，和autowire几乎一样，支持@Primary但不支持required=false）
 *
 * AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
 *
 * 自定义组件想要使用容器的一些组件（ApplicationContext,BeanFactory）
 * 自定义组件实现xxxAware:创建对象的时候，调用Aware接口的方法注入相关组件
 *      xxxAware功能通过xxxProcessor实现ApplicationContextAware===>ApplicationContextAwareProcessor
 *
 *
 *
 *
 *
 */
@Configuration
@ComponentScan({"com.atguigu.controller","com.atguigu.service","com.atguigu.dao"})
public class MainConfig5 {

    @Primary
    @Bean("bookDao2")
    public BookDao bookDao(){
        return new BookDao("2");
    }
}
